#ifndef _DEVICE_PARAMETER_H_
#define _DEVICE_PARAMETER_H_

#include <string.h>
#include <stdint.h>
#include <config.h>
#include <stdbool.h>

/* 定义时区偏移 */
// 最小时区
#define MIX_TIME_ZONE_OFFSET (0ul)
// 最大时区
#define MAX_TIME_ZONE_OFFSET (24ul)
// 默认时区
#define DEFAULT_TIME_ZONE_OFFSET (8ul)

/* 系统音量等级 0 - 15 */
// 最小音量
#define MIX_VOLUME_LEVEL (0ul)
// 最大音量
#define MAX_VOLUME_LEVEL (15ul)
// 默认音量
#define DEFAULT_VOLUME_LEVEL MAX_VOLUME_LEVEL

/* 电机驱动时间 100 - 800 毫秒 */
// 最小电机驱动时间
#define MIX_MOTOR_DRIVE_TIME (10ul)
// 最大电机驱动时间
#define MAX_MOTOR_DRIVE_TIME (80ul)
// 默认电机驱动时间
#define DEFAULT_MOTOR_DRIVE_TIME (15ul)

/* 开锁时间 3 - 9 秒 */
// 最小开锁时间
#define MIX_UNLOCK_TIME (3ul)
// 最大开锁时间
#define MAX_UNLOCK_TIME (9ul)
// 默认开锁时间
#define DEFAULT_UNLOCKING_TIME (6ul)

/* 蓝牙连接超时时间 10 - 60 秒 */
// 最小连接超时时间
#define MIX_CONNECTION_TIMEOUT (10ul)
// 最大连接超时时间
#define MAX_CONNECTION_TIMEOUT (60ul)
// 默认连接超时时间
#define DEFAULT_CONNECTION_TIMEOUT (30ul)

/* 定义人脸检索时间 */
// 最小检索时间
#define MIX_FACE_SEARCH_TIME (3ul)
// 最大检索时间
#define MAX_FACE_SEARCH_TIME (20ul)
// 默认检索时间
#define DEFAULT_FACE_SEARCH_TIME (5ul)

/* 定义假锁警报间隔检测时间 */
// 最小间隔提示时间
#define MIX_FLASE_LOCK_DETCETION_INTERVAL_TIME (1ul)
// 最大间隔提示时间
#define MAX_FLASE_LOCK_DETCETION_INTERVAL_TIME (3ul)
// 默认间隔提示时间
#define DEFAULT_FLASE_LOCK_DETCETION_INTERVAL_TIME (1ul)

/* 定义防撬警报间隔提示时间 */
// 最小间隔提示时间
#define MIX_BREAK_IN_DETCETION_INTERVAL_TIME (1ul)
// 最大间隔提示时间
#define MAX_BREAK_IN_DETCETION_INTERVAL_TIME (60ul)
// 默认间隔提示时间
#define DEFAULT_BREAK_IN_DETCETION_INTERVAL_TIME (1ul)

/* 定义常开事件间隔提示时间 */
// 最小间隔提示时间
#define MIX_NORMAL_OPEN_HINT_INTERVAL_TIME (5ul)
// 最大间隔提示时间
#define MAX_NORMAL_OPEN_HINT_INTERVAL_TIME (60ul)
// 默认间隔提示时间
#define DEFAULT_NORMAL_OPEN_HINT_INTERVAL_TIME (10ul)

/* 定义反锁事件间隔提示时间 */
// 最小间隔提示时间
#define MIX_LOCKED_IN_HINT_INTERVAL_TIME (5ul)
// 最大间隔提示时间
#define MAX_LOCKED_IN_HINT_INTERVAL_TIME (60ul)
// 默认间隔提示时间
#define DEFAULT_LOCKED_IN_HINT_INTERVAL_TIME (10ul)

/* 定义识读M1卡扇区 1 - 15 */
// 可操作起始扇区号
#define START_OPERATION_M1_SECTOR (1ul)
// 可操作结束扇区号
#define END_OPERATION_M1_SECTOR (15ul)
// 默认使用扇区号
#define DEFAULT_OPERATION_M1_SECTOR (10ul)

/* 定义默认心跳发送间隔 */
// 最小心跳发送间隔
#define MIX_HEARTBEAT_CYCLE (10ul)
// 最大心跳发送间隔
#define MAX_HEARTBEAT_CYCLE (1440ul)
// 默认心跳发送间隔
#define DEFAULT_HEARTBEAT_CYCLE (360ul)

/* 定义最大持卡人数量 */
// 最小支持持卡人
#define MIX_NUMBER_OF_CARDHOLDER (30ul)
// 最大支持持卡人
#define MAX_NUMBER_OF_CARDHOLDER (100ul)
// 默认持卡人数量
#define DEFAULT_NUMBER_OF_CARDHOLDER MAX_NUMBER_OF_CARDHOLDER

/* 定义鉴权允许时间误差系数 */
// 最小允许误差系数
#define MIX_ALLOWABLE_TIME_ERROR (1ul)
// 最大允许误差系数
#define MAX_ALLOWABLE_TIME_ERROR (30ul)
// 默认允许误差系数
#define DEFAULT_ALLOWABLE_TIME_ERROR (5ul)

/* 定义播报天数额定值 */
// 最小播报天数
#define MIX_BROADCAST_DAYS (3ul)
// 最大播报天数
#define MAX_BROADCAST_DAYS (9ul)
// 默认播报天数
#define DEFAULT_BROADCAST_DAYS MAX_BROADCAST_DAYS

/* 定义键盘灵敏度阈值 */
// 最小值
#define MIX_KEYBOARD_SENSITIVITY (5ul)
// 最大值
#define MAX_KEYBOARD_SENSITIVITY (63ul)
// 默认灵敏度
#define DEFAULT_KEYBOARD_SENSITIVITY (10ul)

/* 定义卡片识读灵敏度 */
// 最小值
#define MIX_CARD_RECOGNITION_SENSITIVITY (5ul)
// 最大值
#define MAX_CARD_RECOGNITION_SENSITIVITY (48ul)
// 默认灵敏度
#define DEFAULT_CARD_RECOGNITION_SENSITIVITY (10ul)

/* 定义更新蓝牙广播间隔时间 */
// 最小值
#define MIX_UPDATE_BLUETOOTH_BROADCAST_INTERVAL (10ul)
// 最大值
#define MAX_UPDATE_BLUETOOTH_BROADCAST_INTERVAL (60ul)
// 默认间隔时间
#define DEFAULT_UPDATE_BLUETOOTH_BROADCAST_INTERVAL (30ul)

/* 定义系统锁定时间 */
// 最小锁定时间
#define MIX_SYSTEM_LOCKED_TIME (0ul)
// 最大锁定时间
#define MAX_SYSTEM_LOCKED_TIME (60ul)
// 默认锁定时间
#define DEFAULT_SYSTEM_LOCKED_TIME (30ul)

/* 无线模组发射功率 */
// 最小发射功率
#define MIX_WIRELESS_MODULE_EMISSION_POWER (1ul)
// 最大发射功率
#define MAX_WIRELESS_MODULE_EMISSION_POWER (21ul)
// 默认发射功率
#define DEFAULT_WIRELESS_MODULE_EMISSION_POWER (0ul)

/* 无线模组入网超时时间 */
// 最小入网超时时间
#define MIX_WIRELESS_MODULE_NETWORK_TIMEOUT (7ul)
// 最大入网超时时间
#define MAX_WIRELESS_MODULE_NETWORK_TIMEOUT (30ul)
// 默认入网超时时间
#define DEFAULT_WIRELESS_MODULE_NETWORK_TIMEOUT (7ul)

/* 无线模组频点范围 */
// 最小频点
#define MIX_WIRELESS_MODULE_FREQUENCY_RANGE (1ul)
// 最大频点
#define MAX_WIRELESS_MODULE_FREQUENCY_RANGE (195ul)
// 默认频点
#define DEFAULT_WIRELESS_MODULE_FREQUENCY_RANGE (0ul)

/* 定义默认日志堆栈深度 */
// 最大日志堆栈深度
#define MAX_OF_LOG_STACK_DEPTH (600ul)

// 默认加密密钥
#define DEFAULT_ENCRYPTION_KEY_VALUE ((uint8_t[ENCRYPTION_KEY_LENGTH]){"yglock.com"})
// 默认出厂日期
#define DEFAULT_LOCK_DELIVER_DATE 0x00000000
// 主板最大数量
#define IOBOARD_DEVICE_NUM 8
#if _BOARD_TYPE_ == _V31_A_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "V31_250315_STD_N_A"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "V31_25052101_STD_SV"

#elif _BOARD_TYPE_ == _V32_A_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "V32_25043001_STD_L"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "V32_DL_250501501_STD_SV"

#elif _BOARD_TYPE_ == _V32_B_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "V32_241102_CUS_R_A"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "V32_250219_CUS_N_A"

#elif _BOARD_TYPE_ == _V33_A_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "V33_241224_STD_CN"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "V33_25051201_STD_CN"

#elif _BOARD_TYPE_ == _V33_B_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "V33_250422_STD_NV"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "V33_25043001_STD_NV"

#elif _BOARD_TYPE_ == _V33_C_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "V33_250422_STD_NV"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "V33_25043001_STD_NV"

#elif _BOARD_TYPE_ == _DA01_A_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "DA01_250407_BATE_CV"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "DA01_2500514_BATE_CV"

#elif _BOARD_TYPE_ == _DA01_B_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "DA01_25051701_STD_CV"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "DA01_2500528_STD_SV"

#elif _BOARD_TYPE_ == _CR01_BU_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE "EC01_250722"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION "EC01_250905_YG_B_BC_ST01"
#endif

// 默认芯片型号
#define DEFAULT_CHIP_MODEL_NUMBER "CH584M"
// 默认QC质检员编码
#define DEFAULT_QUALITY_INSPECTOR_CODE "UNKOWN"

/* 定义默认服务器参数 */
#if _NETWORK_SERVICE_TYPE_ == _TCP_NETWORK_SERVICE_
// 默认服务器连接端口号
#define DEFAULT_CONNECT_SERVER_PORT 4913
// 默认服务器域名
#define DEFAULT_DOMAIN_NAME "gw.yglock.com"

#elif _NETWORK_SERVICE_TYPE_ == _MQTT_NETWORK_SERVICE_
// 默认服务器连接端口号
#define DEFAULT_CONNECT_SERVER_PORT 1883
// 默认服务器域名
#define DEFAULT_DOMAIN_NAME "gw.yglock.com"
#endif

// 默认服务器地址
#ifndef DEBUG
#define DEFAULT_SERVER_ADDRESS ((uint8_t[]){8, 129, 79, 168})

#else
#define DEFAULT_SERVER_ADDRESS ((uint8_t[]){47, 106, 35, 109})
#endif

// 默认 DNS 服务器地址
#define DEFAULT_DNS_SERVER_ADDRESS ((uint8_t[]){114, 114, 114, 114})

/* 定义 MQTT 相关默认参数 */
// 默认 MQTT 登录用户名
#define DEFAULT_MQTT_USER_NAME "user"
// 默认 MQTT 登录密钥
#define DEFAULT_MATT_PASSWORD "mqtt_6636"
// 默认 MQTT 服务器订阅主题
#define DEFAULT_MQTT_PUBLISH_TOPIC "ygs/lock/publish"
// 默认 MQTT 服务器发布主题
#define DEFAULT_MQTT_SUBSCRIBE_TOPIC "ygs/lock/subscribe"

// 默认超级管理员密码
#define DEFAULT_SUPER_ADMIN_PASSWORD ((char[NUMBER_OF_KEYBOARD_KEY]){'1', '2', '3', '4', '5', '6'})
// 默认扇区访问密钥
#define DEFAULT_M1_ACCESS_KEY ((uint8_t[]){0x58, 0x57, 0xB7, 0x68, 0xF4, 0xBD})
// 默认授权时间
#define DEFAULT_AUTHORIZATION_START_TIME 1735660800

// 系统锁定补偿时间 - 60s
#define SYSTEM_LOCKED_COMPENSATION_TIME (60ul)
// 查询
#define QUERY_DEVICE_PARM_VALUE 0x11
// 设置
#define SET_DEVICE_PARM_VALUE 0x10



/**
 * @brief io板地址
 *
 */
typedef enum
{
  NO_ONE_ADDRESS_IO_BOARD = 0x01,
  NO_TWO_ADDRESS_IO_BOARD = 0x02,
  NO_THREE_ADDRESS_IO_BOARD = 0x04,
  NO_FOUR_ADDRESS_IO_BOARD = 0x08,
  NO_FIVE_ADDRESS_IO_BOARD = 0x10,
  NO_SIX_ADDRESS_IO_BOARD = 0x20,
  NO_SEVEN_ADDRESS_IO_BOARD = 0x40,
  NO_EIGHT_ADDRESS_IO_BOARD = 0x80,
} address_io_board_t;

/**
 * @brief 梯控主板设备信息结构体
 *
 */
typedef struct
{
  uint8_t DeviceType;                               // 类型
  char FactoryDate[NUMBER_OF_DATE_OF_PRODUCTION];   // 出厂日期
  char HardWareVersion[NUMBER_OF_FIRMWARE_VERSION]; // 硬件版本
  char QCCode[NUMBER_OF_QC_CODE];                   // 质检员编码
  char FirmwareVersion[NUMBER_OF_FIRMWARE_VERSION]; // 固件版本
  char ChipModel[NUMBER_OF_CHIP_TYPE_LENGTH];       // 芯片型号
  bool BoardIsExist;                                // 主板是否存在
  uint8_t IoBoardAddress;                           // 地址为0x01，0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
} IoboardDeviceInfo_t;

/**
 * @brief 电梯公共参数结构体
 *
 */
typedef struct
{
  uint8_t OperationType;                                    // 操作类型
  uint8_t PublicFloorData[FLOOR_ARRAY_DATA_LEN];            // 公共楼层数据
} ElevatorPublicFloorInfo_t;

/**
 * @brief 离线卡禁用模式
 *
 */
typedef enum
{
  DISABLE_SPECIFIC_CARD_TYPE, // 禁用特定卡类型
  ENABLE_SPECIFIC_CARD_TYPE,  // 使能特定卡类型
} OfflineCardDisableMode_t;

#define MESSAGE_DATA_PACKET_LENGTH_S 512
/**
 * @brief  固件传输信息 结构体
 *
 */
typedef struct
{
  uint16_t IoBoardFirmwareSumSize;                               // 固件总大小
  uint16_t CurrentSendPackageSeqNumber;                          // 当前发送的包序号
  uint8_t SinglePackageSendBuffer[MESSAGE_DATA_PACKET_LENGTH_S]; // 数据缓冲区 506
  uint16_t SinglePackageSendBufferSize;                          // 每包的长度
  uint16_t SentDataSize;                                         // 已发送的数据大小
  uint8_t SumSentPackageNumber;                                  // 总发送的包数量
} IoBoardFirmwareInfo_t;

/**
 * @brief 定义设备模式
 *
 */
typedef enum
{
  FACTORY_SETTING = 0x10,  // 出厂设置
  NORMAL_MODE = 0x11,      // 正常模式
  FIRMWARE_UPGRADE = 0x80, // 固件更新模式
} DeviceInitState_t;

/*
 * @brief 定义设备类型
 *
 */
typedef enum
{
  B_C = 0x01,            // 蓝牙刷卡线路板
  B_CM = 0x02,           // 蓝牙卡密线路板
  BT_C = 0x03,           // 蓝牙特高频刷卡线路板
  BT_CM = 0x04,          // 蓝牙特高频卡密线路板
  BT_CMA = 0x05,         // 蓝牙特高频卡密人脸线路板
  BT_CMF = 0x06,         // 蓝牙特高频指纹卡密线路板
  B4_CM = 0x07,          // 蓝牙4G(Cat.1)卡密线路板
  B4_CMA = 0x08,         // 蓝牙4G(Cat.1)卡密人脸线路板
  B4_CMF = 0x09,         // 蓝牙4G(Cat.1)卡密指纹线路板
  TYB_C = 0x64,          // 天猫蓝牙刷卡线路板
  HYB_C = 0x6E,          // 华为蓝牙刷卡线路板
  CR01_BU = 0xC8,        // 制卡器-蓝牙WiFiUSB版本
  PS01_BR_C = 0xCD,      // 取电开关-蓝牙网线刷卡版
  EC01_CR_B_C = 0xD2,    // 梯控-蓝牙WiFi 刷卡二维码版本
  DA01_B_C = 0xDC,       // 门禁-蓝牙卡密二维码版本
  TW_BC4_01 = 0xE0,      // 台湾定制蓝牙刷卡
  TYPE_NO_DEFINE = 0xFF, // 未定义
} DeviceType_t;

/**
 * @brief 卡片识读类型
 *
 */
typedef enum
{
  READER_BY_MIFARE_CARD = 0x10,               // MIFARE 卡（杨格）
  READER_BY_CPU_CARD = 0x11,                  // CPU 卡（杨格）
  READER_BY_IDENTIY_CARD = 0x12,              // 身份证
  READER_BY_MIFARE_CPU_CRAD = 0x13,           // MIFARE + CPU 卡
  READER_BY_MIFARE_IDENTIY_CRAD = 0x14,       // MIFARE + 身份证
  READER_BY_CPU_IDENTIY_CARD = 0x15,          // CPU + 身份证
  READER_BY_MIFARE_OTHER_CARD = 0x16,         // MIFARE + 其他
  READER_BY_CPU_OTHER_CARD = 0x17,            // CPU + 其他
  READER_BY_IDENTIY_OTHER_CARD = 0x18,        // 身份证 + 其他
  READER_BY_H_WORLD_GROUP_MIFARE_CARD = 0x80, // 华住 MIFARE 卡
  READER_BY_H_WORLD_GROUP_CPU_CARD = 0x81,    // 华住 CPU 卡
} TypeOfReading_t;

/**
 * @brief 第三方读卡类型
 * 
 */
typedef enum
{
  THIRD_PARTY_READ_TYPE_ELEVATOR_N_DOORLOCK = 0x10,   //梯控+门锁共用协议
  THIRD_PARTY_READ_TYPE_DOOR_LOCK_SPEI = 0x11,        //门锁专用协议
  THIRD_PARTY_READ_TYPE_ELEVATOR_SPECI = 0x12         //梯控专用协议 
}ThirdPartyReadType_t;

/**
 * @brief 协议格式
 *
 */
typedef enum
{
  PROTOCOL_FORMAT_YGS = 0x10,  // YGS
  PROTOCOL_FORMAT_SMSZ = 0x11, // 尚美
  PROTOCOL_FORMAT_DL = 0x12,   // 德胧
} DevProtocolFormat_t;

/**
 * @brief 设置网络运营商
 *
 */
typedef enum
{
  CHINA_MOBILE = 0x10,  // 中国移动
  CHINA_UNICOM = 0x11,  // 中国联通
  CHINA_TELECOM = 0x12, // 中国电信
} NetworkOperator_t;

/**
 * @brief 主板更新状态
 * 
 */
typedef enum
{
  UPDATE_BOARD_STATUS_IDLE = 0x00, // 空闲状态
  UPDATE_BOARD_STATUS_PROGRESS = 0x01, // 进行中
  UPDATE_BOARD_STATUS_SUCCESS = 0x02, // 成功
  UPDATE_BOARD_STATUS_FAILED = 0x03, // 失败
} UpdateBoardStatus_t;


/**
 * @brief 离线卡类型
 *
 */
typedef enum
{
  GUEST_CARD = 0x11,       // 宾客卡
  MASTER_CARD = 0x12,      // 总卡
  BUILD_CARD = 0x13,       // 楼栋卡
  FLOOR_CARD = 0x14,       // 楼层卡
  PARK_CARD = 0x15,        // 园区卡
  NORMAL_OPEN_CARD = 0x19, // 常开卡
} CardType_t;

#pragma pack(push, 1)

/**
 * @brief 封卡/封门标识
 *
 */
typedef union
{
  uint8_t Ident;

  struct OfflineCardEnBitClass
  {
    uint8_t MasterCard : 1;
    uint8_t ParkCard : 1;
    uint8_t BuildCard : 1;
    uint8_t FloorCard : 1;
    uint8_t GuestCard : 1;
    uint8_t NormalOpenCard : 1;
    uint8_t Operation : 1;
    uint8_t Function : 1;
  } OfflineCardEnBit;
} OfflineCardEn_t;

/**
 * @brief 播报天数属性信息
 *
 */
typedef struct
{
  uint8_t ContorlEn;     // 控制位
  uint8_t RemainingDays; // 剩余天数
} RemainingDaysAttribute_t;

/**
 * @brief 卡片访问属性
 *
 */
typedef struct
{
  uint8_t Sector;                            // 识读扇区
  uint8_t TypeOfReading;                     // 识读类型
  uint8_t ThirdPartyTypeOfReading;           // 三方识读类型 ThirdParty
  uint8_t SectorKey[CRAD_SECTOR_KEY_LENGTH]; // 扇区密钥
} CardAccessAttribute_t;

/**
 * @brief 系统访问属性
 *
 */
typedef struct
{
  uint32_t CustomerCode;                           // 客户编码
  uint32_t AuthorizationEndTime;                   // 授权结束时间
  uint8_t EncryptionKey[ENCRYPTION_KEY_LENGTH];    // 加解密密钥
  char SuperAdminPassword[NUMBER_OF_KEYBOARD_KEY]; // 超级管理员密码
} SystemAccessAttribute_t;

/**
 * @brief 传感器控制
 *
 */
typedef union
{
  uint8_t SensorFunctionControl;

  struct SensorControlBitClass
  {
    uint8_t KeyTiggerResetEn : 1;  // 钥匙重置使能位
    uint8_t StartTimeVerifyEn : 1; // 开始时间验证使能
    uint8_t DoubleLockEn : 1;      // 允许开反锁
    uint8_t NormalOpenEn : 1;      // 常开使能
    uint8_t Reserved : 4;          // 保留位
  } SensorControlBit;
} SensorFunctionControl_t;

/**
 * @brief 错误提示功能控制
 *
 */
typedef union
{
  uint8_t Ident;

  struct ErrorPromptFunctionControlBitClass
  {
    uint8_t LockedTime : 6;   // 锁定时间
    uint8_t SafetyModule : 1; // 撬锁
    uint8_t Rfid : 1;         // 假锁
  } ErrorPromptFunctionControlBit;
} ErrorPromptFunctionControl_t;

/**
 * @brief 定义设备版本信息
 *
 */
typedef struct
{
  uint8_t DeviceModel;                                           // 设备类型
  uint32_t DateOfProduction;                                     // 出厂日期
  char QCCode[NUMBER_OF_QC_CODE];                                // 质检员编码
  char ChipModel[NUMBER_OF_CHIP_TYPE_LENGTH];                    // 芯片型号长度
  char PcbVersionNumber[NUMBER_OF_FIRMWARE_VERSION];             // 电路板版本号
  char FirmwareVersionNumber[NUMBER_OF_FIRMWARE_VERSION];        // 固件版本
  char IoBoardFirmwareVersionNumber[NUMBER_OF_FIRMWARE_VERSION]; // 固件版本
  uint8_t Reserve[12];                                           // 预留
} VersionControl_t;

/**
 * @brief 卡顶替时间
 *
 */
typedef struct
{
  uint16_t ParkCardReplaceId;       // 园区卡顶替编码
  uint16_t BuildCardReplaceId;      // 楼栋卡顶替编码
  uint16_t FloorCardReplaceId;      // 楼层卡顶替编码
  uint16_t GusetCardReplaceId;      // 宾客卡顶替编码
  uint16_t MasterCardReplaceId;     // 总卡顶替编码
  uint16_t NormalOpenCardReplaceId; // 常开卡顶替编码

  uint32_t ParkCardReplaceTime;       // 园区卡顶替时间
  uint32_t BuildCardReplaceTime;      // 楼栋卡顶替时间
  uint32_t FloorCardReplaceTime;      // 楼层卡顶替时间
  uint32_t GusetCardReplaceTime;      // 宾客卡顶替时间
  uint32_t MasterCardReplaceTime;     // 总卡顶替时间
  uint32_t NormalOpenCardReplaceTime; // 常开卡顶替时间
  uint8_t Reserved[12];               // 预留
} ReplaceInformation_t;

/**
 * @brief 免打扰配置
 *
 */
typedef struct
{
  uint8_t StartHour;   // 开始时
  uint8_t StartMinute; // 开始分
  uint8_t EndHour;     // 结束时
  uint8_t EndMinute;   // 结束分
} NoDisturbingSetting_t;



/**
 * @brief 系统参数设置
 *
 */
typedef struct
{
  uint8_t TimeZone;                                        // 系统时区
  uint8_t SystemVolume;                                    // 系统音量
  uint8_t UnlockingTime;                                   // 开锁时间
  uint8_t MotorDriveTime;                                  // 电机驱动时间
  uint8_t NetworkOperator;                                 // 网络运营商
  uint16_t HeartbeatCyclel;                                // 心跳周期
  uint8_t NumberOfCardholder;                              // 持卡人数量
  uint8_t AllowableTimeError;                              // 鉴权时间误差
  uint8_t KeyBoardSensitivity;                             // 键盘灵敏度
  uint8_t SearchTimeout;                                   // 检索超时时间
  OfflineCardEn_t OfflineCardEn;                           // 离线卡使能配置
  uint8_t BreakInBlinkingInterval;                         // 撬锁警报间隔提示时间
  uint8_t ProtocolFormat;                                  // 协议格式
  uint8_t LockedInBlinkingInterval;                        // 反锁提示间隔时间
  uint8_t FlaseLockBlinkingInterval;                       // 假锁警报间隔提示时间
  uint8_t NormalOpenBlinkingInterval;                      // 常开提示间隔时间
  uint8_t BluetoothConnectionTimeout;                      // 蓝牙连接超时时间
  uint8_t BluetoothUpdateRaidioInterval;                   // 蓝牙广播更新时间
  uint32_t LastActiveTimestamp;                            // 最后活跃时间
  ErrorPromptFunctionControl_t ErrorPromptFunctionControl; // 错误提示功能控制
  uint8_t CardReadingSensitivity;                          // 卡片识别灵敏度
  uint8_t ElevatorId;                                      // 电梯机号
  uint8_t ElevatorStartFloor;                              // 起始楼层
  uint8_t BoardFirmwareExistFlag;                          // 板子固件存在标志位
  uint8_t ElevatorPublicFloorData[FLOOR_ARRAY_DATA_LEN];   // 公共楼层
  uint8_t EleControlBoardNumber;                           //梯控主板数量
  uint8_t EleControlSwitch;                                // 开启/停用梯控
  uint8_t FireAlarmMode;                                   // 火灾报警模式 10H：不处理，保持梯控原有模式（默认); 11H: 取消受控模式，开放所有楼层按键; 12H：禁止刷卡，禁止使用所有楼层按键（即禁止乘梯）
  // uint8_t Reserve[1];                                      // 预留
  uint8_t BleMasterConnectRssi; //蓝牙主机连接从机信号强度 (这个值是正数，转成负数用0-该值)
  uint8_t MasterModeSwitch; //蓝牙主机模式开关
} DeviceAttribute_t;

/**
 * @brief 描述网络属性
 *
 */
typedef struct
{
  uint16_t ServerPort;                                // 服务器端口号
  char Publish[NUMBER_OF_MQTT_TOPIC_BIT];             // 设备推送主题
  char Subscribe[NUMBER_OF_MQTT_TOPIC_BIT];           // 设备订阅主题
  char Password[NUMBER_OF_MQTT_PASSWORD_BIT];         // 登录密码
  char UserName[NUMBER_OF_MQTT_USER_NAME_BIT];        // 登录用户名
  uint8_t DnsAddress[NUMBER_OF_SERVER_IP_ADDRESS];    // DNS服务器IP地址
  char DomianName[NUMBER_OF_SERVER_DOMIAN_NAME_BIT];  // 域名地址
  uint8_t ServerAddress[NUMBER_OF_SERVER_IP_ADDRESS]; // 服务器IP地址
  uint8_t WirelessModuleEmissionPower;                // 无线模组发射功率
  uint8_t WirelessModuleNetworkTimeout;               // 无线模组入网超时时间
  uint8_t WirelessModuleFrequencyRange;               // 无线模组频点范围
  uint8_t Reserve;                                    // 预留
} NetworkAttribute_t;

/**
 * @brief 门锁归属信息
 *
 */
typedef struct
{
  uint32_t RoomId;         // 房间号
  uint8_t FloorId;         // 楼层
  uint8_t GardenId;        // 园区号
  uint8_t SubroomId;       // 子房间号
  uint8_t BuildingId;      // 楼栋
  uint16_t RoomType;       // 房间类型
  uint32_t GroupingNumber; // 分组号
  uint8_t Reserve[12];     // 预留
} AffiliationAttribute_t;

/**
 * @brief 授权管理
 *
 */
typedef struct
{
  CardAccessAttribute_t CardAccessAttribute;       // 卡片访问属性
  CardAccessAttribute_t ElevatorCardAccessAttribute;// 电梯卡片访问属性
  AffiliationAttribute_t AffiliationAttribute;     // 设备归属信息
  SystemAccessAttribute_t SystemAccessAttribute;   // 系统访问属性
  RemainingDaysAttribute_t RemainingDaysAttribute; // 有效天数
  uint8_t Reserve[12];                             // 预留
} LicenceInformation_t;

/**
 * @brief 系统配置信息
 *
 */
typedef struct
{
  uint8_t DeviceInitState;                 // 设备状态
  LicenceInformation_t LicenceInformation; // 授权信息

  VersionControl_t VersionControl;               // 版本控制
  DeviceAttribute_t DeviceAttribute;             // 设备属性
  NetworkAttribute_t NetworkAttribute;           // 网络属性
  ReplaceInformation_t ReplaceInformation;       // 卡片顶替时间
  NoDisturbingSetting_t NoDisturbingSetting;     // 免打扰配置
  SensorFunctionControl_t SensorFunctionControl; // 功能使能位
} DeviceInformation_t;
#pragma pack(pop)

/**
 * @brief 获取设备初始化状态
 *
 * @return uint8_t - 初始化状态
 */
extern uint8_t GetDeviceInitStatus(void);

/**
 * @brief 设置设备初始化状态
 *
 * @param Status - 初始化状态
 */
extern void SetDeviceInitStatus(uint8_t Status);

/**
 * @brief 获取钥匙重置使能标识
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetTheKeyToResetEn(void);

/**
 * @brief 设置获取钥匙重置使能标识
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetTheKeyToResetEn(bool En);

/**
 * @brief 获取开始时间验证使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetStartTimeVerifyEn(void);

/**
 * @brief 设置开始时间验证使能位
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetStartTimeVerifyEn(bool En);

/**
 * @brief 获取允许开反锁使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetAllowedToOpenDoubleLockEn(void);

/**
 * @brief 设置允许开反锁使能位
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetAllowedToOpenDoubleLockEn(bool En);

/**
 * @brief 获取常开使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetNormalOpenEn(void);

/**
 * @brief 设置常开使能位
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetNormalOpenEn(bool En);

/**
 * @brief 批量获取设置板载功能
 *
 * @return uint8_t - 控制位
 */
extern uint8_t GetOnboardFunctionsInBatches(void);

/**
 * @brief 批量设置板载功能
 *
 * @param BasicContorl - 控制位
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetOnboardFunctionsInBatches(uint8_t BasicContorl);

/**
 * @brief 获取设备型号
 *
 * @return uint8_t - 设备型号
 */
extern uint8_t GetObtainTheDeviceModel(void);

/**
 * @brief 设置设备型号
 *
 * @param DeviceModel - 设备型号
 * @return bool       - 设置状态(true-成功  false-失败)
 */
extern bool SetObtainTheDeviceModel(DeviceType_t DeviceModel);

/**
 * @brief 获取质检员编码
 *
 * @param pCode - 质检员编码
 * @return bool - 获取状态(true:成功 false:失败)
 */
extern bool GetQualityInspectorCode(void *pCode);

/**
 * @brief 设置质检员编码
 *
 * @param pCode - 质检员编码
 * @return bool - 设置状态(true:成功 false:失败)
 */
extern bool SetQualityInspectorCode(const void *pCode);

/**
 * @brief 获取电路板版本信息
 *
 * @param pModel - 电路板版本号
 * @return bool  - 获取状态(true:成功 false:失败)
 */
extern bool ObtainCircuitBoardModel(void *pModel);

/**
 * @brief 设置门锁电路板版本信息
 *
 * @param pModel - 电路板版本号
 * @return bool  - 设置状态(true:成功 false:失败)
 */
extern bool WriteCircuitBoardType(const void *pModel);

/**
 * @brief 获取门锁出厂日期
 *
 * @return uint32_t - 出厂日期(时间戳方式显示)
 */
extern uint32_t ObtainTheDeliveryDateOfTheDevice(void);

/**
 * @brief 设置门锁出厂日期
 *
 * @param DateOfProduction - 出厂日期(时间戳方式显示)
 * @return bool            - 设置状态(true:成功 false:失败)
 */
extern bool SetTheDeviceDeliveryDate(uint32_t DateOfProduction);

/**
 * @brief 获取固件版本信息
 *
 * @param pModel - 固件版本号
 * @return bool  - 获取状态(true:成功 false:失败)
 */
extern bool GetDeviceFirmwareVersion(void *pVersion);

/**
 * @brief 设置固件版本信息
 *
 * @param pVersion - 固件版本号
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetDeviceFirmwareVersion(void *pVersion);

/**
 * @brief 获取芯片型号
 *
 * @param pChipModel - 芯片型号
 * @return bool      - 获取状态(true:成功 false:失败)
 */
extern bool GetChipModel(void *pChipModel);

/**
 * @brief 设置芯片型号
 *
 * @param pChipModel - 芯片型号
 * @return bool      - 设置状态(true:成功 false:失败)
 */
extern bool SettingTheChipModel(const char *pChipModel);

/**
 * @brief 获取系统时区
 *
 * @return uint8_t - 当前时区
 */
extern uint8_t GetSystemTimeZone(void);

/**
 * @brief 设置系统时区
 *
 * @param TimeZone - 新时区
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetSystemTimeZone(uint8_t TimeZone);

/**
 * @brief 获取宾客卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetGuestCardReplaceId(void);

/**
 * @brief 设置宾客卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetGuestCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取总卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetMasterCardReplaceId(void);

/**
 * @brief 设置总卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetMasterCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取楼栋卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetBuildCardReplaceId(void);

/**
 * @brief 设置楼栋卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetBuildCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取楼层卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetFloorCardReplaceId(void);

/**
 * @brief 设置楼层卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetFloorCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取园区卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetParkCardReplaceId(void);

/**
 * @brief 设置园区卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetParkCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取常开卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetNormalOpenCardReplaceId(void);

/**
 * @brief 设置常开卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetNormalOpenCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取宾客卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetGuestCardReplaceTime(void);

/**
 * @brief 设置宾客卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetGuestCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取总卡卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetMasterCardReplaceTime(void);

/**
 * @brief 设置总卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetMasterCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取楼栋卡卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetBuildCardReplaceTime(void);

/**
 * @brief 设置楼栋卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetBuildCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取楼层卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetFloorCardReplaceTime(void);

/**
 * @brief 设置楼层卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetFloorCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取园区卡卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetParkCardReplaceTime(void);

/**
 * @brief 设置园区卡卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetParkCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取设置常开卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetNormalOpenCardReplaceTime(void);

/**
 * @brief 设置设置常开卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetNormalOpenCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取系统音量等级
 *
 * @return uint8_t - 音量等级(0-9)
 */
extern uint8_t GetSystemVolumeLevel(void);

/**
 * @brief 设置系统音量等级
 *
 * @param VolumeLevel - 音量等级(0-9)
 * @return bool       - 设置状态(true-成功  false-失败)
 */
extern bool SetSystemVolumeLevel(uint8_t VolumeLevel);

/**
 * @brief 获取电机驱动时间
 *
 * @return uint8_t - 电机驱动时间
 */
extern uint8_t GetMotorDriveTime(void);

/**
 * @brief 设置电机驱动时间
 *
 * @param DriveTime - 电机驱动时间
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool SetMotorDriveTime(uint8_t DriveTime);

/**
 * @brief 获取自动关锁时间
 *
 * @return uint8_t - 关锁时间
 */
extern uint8_t GetUnlockTime(void);

/**
 * @brief 设置自动关锁时间
 *
 * @param TimeOfUnlock - 关锁时间
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetUnlockTime(uint8_t TimeOfUnlock);

/**
 * @brief 获取网络运营商
 *
 * @return NetworkOperator_t - 网络运营商
 */
extern uint8_t GetNetworkOperator(void);

/**
 * @brief 设置网络运营商
 *
 * @param Operator - 运营商
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetNetworkOperator(uint8_t Operator);

/**
 * @brief 获取心跳发送间隔周期
 *
 * @return uint16_t - 心跳间隔
 */
extern uint16_t GetHeartbeatTransmissionCycle(void);

/**
 * @brief 设置心跳发送间隔周期
 *
 * @param HeartbeatCyclel - 心跳间隔
 * @return bool           - 设置状态(true-成功  false-失败)
 */
extern bool SetHeartbeatTransmissionCycle(uint16_t HeartbeatCyclel);

/**
 * @brief 获取持卡人数量
 *
 * @return uint8_t - 持卡人数量
 */
extern uint8_t GetNumberOfCardholder(void);

/**
 * @brief 设置持卡人数量
 *
 * @param Quantity - 持卡人数量
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetNumberOfCardholder(uint8_t Quantity);

/**
 * @brief 获取鉴权时间判断允许误差
 *
 * @return uint8_t - 误差系数
 */
extern uint8_t GetAllowableTimeError(void);

/**
 * @brief 设置鉴权时间判断允许误差
 *
 * @param TimeError - 误差系数
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetAllowableTimeError(uint8_t TimeError);

/**
 * @brief 获取键盘灵敏度
 *
 * @return uint8_t - 键盘灵敏度
 */
extern uint8_t GetKeyboardSensitivity(void);

/**
 * @brief 设置键盘灵敏度
 *
 * @param Sensitivity - 键盘灵敏度
 * @return bool       - 设置状态（true：成功 false：失败）
 */
extern bool SetKeyboardSensitivity(uint8_t Sensitivity);

/**
 * @brief 获取离线卡使能配置
 *
 * @return uint8_t - 使能配置
 */
extern uint8_t GetOfflineCardFunctionEnable(void);

/**
 * @brief 设置离线卡使能配置
 *
 * @param EnableBit - 使能配置
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool SetOfflineCardFunctionEnable(uint8_t EnableBit);

/**
 * @brief 获取摄像头鉴权模式
 *
 * @return uint8_t - 协议格式
 */
extern uint8_t GetProtocolFormat(void);

/**
 * @brief 设置协议格式
 *
 * @param ProtocolFormat - 协议格式
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool SetProtocolFormat(uint8_t ProtocolFormat);

/**
 * @brief 获取检索时间
 *
 * @return uint8_t - 超时时间
 */
extern uint8_t GetSearchTimeout(void);

/**
 * @brief 设置人脸检索时间
 *
 * @param SearchTime - 检索时间
 * @return bool      - 设置状态(true-成功  false-失败)
 */
extern bool SetSearchTimeout(uint8_t SearchTime);

/**
 * @brief 获取宾客卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetGuestCardEn(void);

/**
 * @brief 设置总卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetMasterCardEn(void);

/**
 * @brief 获取楼栋卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetBuildCardEn(void);

/**
 * @brief 获取楼层卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetFloorCardEn(void);

/**
 * @brief 获取园区卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetParkCardEn(void);

/**
 * @brief 获取常开卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetNormalOpenCardEn(void);

/**
 * @brief 获取蓝牙连接超时时间
 *
 * @return uint8_t - 超时时间
 */
extern uint8_t GetBluetoothConnectionTimeout(void);

/**
 * @brief 设置蓝牙连接超时时间
 *
 * @param Timeout - 超时时间
 * @return bool   - 设置状态(true-成功  false-失败)
 */
extern bool SetBluetoothConnectionTimeout(uint8_t Timeout);

/**
 * @brief 获取蓝牙更新广播间隔时间
 *
 * @return uint8_t - 更新间隔时间
 */
extern uint8_t GetBluetoothUpdateRaidioInterval(void);

/**
 * @brief 设置蓝牙广播更新间隔时间
 *
 * @param Interval - 更新间隔时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetBluetoothUpdateRaidioInterval(uint8_t Interval);

/**
 * @brief 获取设备最后一次操作时间
 *
 * @return uint32_t - 操作时间
 */
extern uint32_t GetDeviceLastActionTime(void);

/**
 * @brief 设置设备最后一次操作时间
 *
 * @param Time - 操作时间
 */
extern void SetDeviceLastActionTime(uint32_t Time);

/**
 * @brief 获取错误提示功能
 *
 * @return uint8_t - 错误提示功能
 */
extern uint8_t GetErrorPromptFunctionConfiguration(void);

/**
 * @brief 设置错误提示功能
 *
 * @param Configuration - 错误提示功能
 * @return bool         - 设置状态(true-成功  false-失败)
 */
extern bool SetErrorPromptFunctionConfiguration(uint8_t Configuration);

/**
 * @brief 获取 RFID 错误提示使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetRfidErrorPromptFunctionEnable(void);

/**
 * @brief 设置 RFID 错误提示使能
 *
 * @param En - 使能状态(true:打开  false:关闭)
 */
extern void SetRfidErrorPromptFunctionEn(bool En);

/**
 * @brief 获取安全模块错误提示使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetSafetyModuleErrorPromptFunctionEnable(void);

/**
 * @brief 设置安全模块错误提示使能
 *
 * @param En - 使能状态(true:打开  false:关闭)
 */
extern void SetSafetyModuleErrorPromptFunctionEn(bool En);

/**
 * @brief 获取系统锁定时间
 *
 * @return uint8_t - 锁定时间
 */
extern uint8_t GetSystemLockedTime(void);

/**
 * @brief 设置系统锁定时间
 *
 * @param LockedInTime - 锁定时间
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetSystemLockedTime(uint8_t LockedInTime);

/**
 * @brief 获取读卡灵敏度
 *
 * @return uint8_t - 读卡灵敏度
 */
extern uint8_t GetCardReadingSensitivity(void);

/**
 * @brief 设置读卡灵敏度
 *
 * @param Sensitivity - 读卡灵敏度
 * @return bool       - 设置状态(true-成功  false-失败)
 */
extern bool SetCardReadingSensitivity(uint8_t Sensitivity);

/**
 * @brief 获取假锁警报间隔检测时间
 *
 * @return uint8_t - 间隔检测时间
 */
extern uint8_t GetFalseLockDetcetionInterval(void);

/**
 * @brief 设置假锁警报间隔检测时间
 *
 * @param Interval - 间隔检测时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetFalseLockDetcetionInterval(uint8_t Interval);

/**
 * @brief 获取撬锁警报间隔检测时间
 *
 * @return uint8_t - 间隔检测时间
 */
extern uint8_t GetTheBreakInDetcetionInterval(void);

/**
 * @brief 设置撬锁警报间隔检测时间
 *
 * @param Interval - 间隔检测时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetBreakInDetcetionInterval(uint8_t Interval);

/**
 * @brief 获取常开事件间隔提示时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t GetNormalOpenReminderInterval(void);

/**
 * @brief 设置常开提示间隔提示时间
 *
 * @param Interval - 间隔提示时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetNormalOpenReminderInterval(uint8_t Interval);

/**
 * @brief 获取反锁提示间隔时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t GetLockedInReminderInterval(void);

/**
 * @brief 设置反锁提示间隔时间
 *
 * @param Interval - 间隔提示时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetLockedInReminderInterval(uint8_t Interval);

/**
 * @brief 获取 DNS 服务器地址
 *
 * @param pMaskAddr - DNS 服务器
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetDnsServerAddress(void *pMaskAddr);

/**
 * @brief 设置 DNS 服务器地址
 *
 * @param pIpAddrIn - DNS服务器地址
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetDnsServerAddress(const void *pIpAddrIn);

/**
 * @brief 获取设备推送主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttPublishTopic(void *pTopic);

/**
 * @brief 设置设备推送主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttPublishTopic(const void *pTopic);

/**
 * @brief 设置设备订阅主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttSubscribeTopic(void *pTopic);

/**
 * @brief 设置设备订阅主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttSubscribeTopic(const void *pTopic);

/**
 * @brief 获取Mqtt登录服务器的密码
 *
 * @param pPassword - 服务器的密码
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttPassword(void *pPassword);

/**
 * @brief 设置Mqtt登录服务器的密码
 *
 * @param pPassword - 服务器的密码
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttPassword(const void *pPassword);

/**
 * @brief 获取服务器目标端口
 *
 * @return uint16_t - 目标端口
 */
extern uint16_t GetNetworkServerPort(void);

/**
 * @brief 设置服务器目标端口
 *
 * @param ServerPort - 目标端口
 * @return bool      - 设置状态(true-成功  false-失败)
 */
extern bool SetNetworkServerPort(uint16_t ServerPort);

/**
 * @brief 获取服务器域名地址
 *
 * @param pMaskAddr - 域名地址
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetNetworkDomianName(void *pMaskAddr);

/**
 * @brief 设置服务器域名地址
 *
 * @param pMaskAddr - 域名地址
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetNetworkDomianName(const void *pDomianName);

/**
 * @brief 获取服务器目标地址
 *
 * @param pIpAddrOut - 目标地址
 * @return bool      - 获取状态(true-成功  false-失败)
 */
extern bool GetServerConnectAddress(void *pIpAddrOut);

/**
 * @brief 设置服务器目标地址
 *
 * @param pIpAddrIn - 目标地址
 * @return bool      - 获取状态(true-成功  false-失败)
 */
extern bool SetServerConnectAddress(const void *pIpAddrIn);

/**
 * @brief 获取Mqtt服务器的用户名
 *
 * @param pUserName - 用户名
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttUserName(void *pUserName);

/**
 * @brief 设置Mqtt服务器的用户名
 *
 * @param pUserName - 用户名
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttUserName(const void *pUserName);

/**
 * @brief 获取无线模组发射功率
 *
 * @return uint8_t - 发射功率
 */
extern uint8_t GetWirelessModuleEmissionPower(void);

/**
 * @brief 设置无线模组发射功率
 *
 * @param EmissionPower - 发射功率
 * @return bool         - 设置状态(true-成功  false-失败)
 */
extern bool SetWirelessModuleEmissionPower(uint8_t EmissionPower);

/**
 * @brief 获取无线模组入网超时时间
 *
 * @return uint8_t - 入网超时时间
 */
extern uint8_t GetWirelessModuleSearchNetworkTimeout(void);

/**
 * @brief 设置无线模组入网超时时间
 *
 * @param NetworkTimeout - 入网超时时间
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool SetWirelessModuleNetworkTimeout(uint8_t NetworkTimeout);

/**
 * @brief 获取无线模组频率范围
 *
 * @return uint8_t - 无线模组频率范围
 */
extern uint8_t GetWirelessModuleFrequencyRange(void);

/**
 * @brief 设置无线模组频率范围
 *
 * @param FrequencyRange - 无线模组频率范围
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool SetWirelessModuleFrequencyRange(uint8_t FrequencyRange);

/**
 * @brief 获取门锁所属园区编码
 *
 * @return uint8_t - 园区编码
 */
extern uint8_t GetLockGardenIdNumber(void);

/**
 * @brief 设置门锁所属园区编码
 *
 * @param GardenId - 园区编码
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetLockGardenIdNumber(uint8_t GardenId);

/**
 * @brief 获取门锁所处的楼栋
 *
 * @return uint8_t - 楼栋号
 */
extern uint8_t GetLockBuildingNumber(void);

/**
 * @brief 设置门锁所处的楼栋
 *
 * @param BuildingId - 楼栋号
 * @return bool      - 设置状态(true-成功  false-失败)
 */
extern bool SetLockBuildingNumber(uint8_t BuildingId);

/**
 * @brief 获取锁所处的楼层
 *
 * @return uint8_t - 楼层号
 */
extern uint8_t GetLockFloorNumber(void);

/**
 * @brief 设置门锁所处的楼层号
 *
 * @param FloorId - 楼层
 * @return bool   - 设置状态(true-成功  false-失败)
 */
extern bool SetLockFloorNumber(uint8_t FloorId);

/**
 * @brief 获取门锁所处的房间号
 *
 * @return uint32_t - 房间号
 */
extern uint32_t GetLockRoomIdNumber(void);

/**
 * @brief 设置门锁所处的房间号
 *
 * @param RoomId - 房间号
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetLockRoomIdNumber(uint32_t RoomId);

/**
 * @brief 获取门锁所处的子房间号
 *
 * @return uint8_t - 子房间号
 */
extern uint8_t GetLockSubroomNumber(void);

/**
 * @brief 设置门锁所处的子房间号
 *
 * @param SubroomId - 子房间号
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetLockSubroomNumber(uint8_t SubroomId);

/**
 * @brief 获取房间类型
 *
 * @return uint16_t - 房间类型
 */
extern uint16_t GetRoomType(void);

/**
 * @brief 设置房间类型
 *
 * @param RoomType - 房间类型
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetRoomType(uint16_t RoomType);

/**
 * @brief 获取分组号
 *
 * @return uint32_t - 分组号
 */
extern uint32_t GetGroupingNumber(void);

/**
 * @brief 设置分组号
 *
 * @param GroupingNumber - 分组号
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetGroupingNumber(uint32_t GroupingNumber);

/**
 * @brief 获取 MIFARE 卡识读扇区
 *
 * @return uint8_t - 目标扇区
 */
extern uint8_t GetCardOperationSector(void);

/**
 * @brief 设置 MIFARE 卡识读扇区
 *
 * @param SectorNumber - 目标扇区
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetCardOperationSector(uint8_t SectorNumber);

/**
 * @brief 获取识读卡片类型
 *
 * @return uint8_t - 卡片类型
 */
extern uint8_t GetReadTheCardType(void);

/**
 * @brief 设置识读卡片类型
 *
 * @param ReadType - 卡片类型
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetReadTheCardType(uint8_t ReadType);

/**
 * @brief 获取卡片访问密钥
 *
 * @param pKey  - 扇区访问密钥
 * @return bool - 获取状态(true-成功  false-失败)
 */
extern bool GetCardOperationSectorKey(uint8_t *pKey);

/**
 * @brief 设置设置访问密钥
 *
 * @param pKeyIn - 扇区访问密钥
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetCardOperationSectorKey(const uint8_t *pKeyIn);

/**
 * @brief 获取客户编码
 *
 * @return uint32_t - 客户编码
 */
extern uint32_t GetCustomerCode(void);

/**
 * @brief 设置客户编码
 *
 * @param CustomerCode - 客户编码
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetCustomerCode(uint32_t CustomerCode);

/**
 * @brief 获取授权结束时间
 *
 * @return uint32_t - 授权结束时间
 */
extern uint32_t GetAuthorizationEndTime(void);

/**
 * @brief 设置授权结束时间
 *
 * @param EndTime - 授权结束时间
 * @return bool   - 设置状态(true-成功  false-失败)

 */
extern bool SetAuthorizationEndTime(uint32_t EndTime);

/**
 * @brief 获取加解密密钥
 *
 * @param pEncryptionKey - 密钥
 * @return bool          - 获取状态(true-成功  false-失败)
 */
extern bool GetEncryptionKey(void *pEncryptionKey);

/**
 * @brief 设置加解密密钥
 *
 * @param pEncryptionKey - 密钥
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool SetEncryptionKey(const void *pEncryptionKey);

/**
 * @brief 获取超级管理员密码
 *
 * @param pPassword - 密码
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetSuperAdministratorPassword(void *pPassword);

/**
 * @brief 设置超级管理员密码
 *
 * @param pPassword - 密码
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetSuperAdministratorPassword(const void *pPassword);

/**
 * @brief 获取播报功能控制位
 *
 * @return bool - 开启状态（true：开启 false：关闭）
 */
extern bool GetDayBroadcastContorlEn(void);

/**
 * @brief 设置播报功能控制位
 *
 * @param ContorlEn - 开启状态（true：开启 false：关闭）
 * @return bool     - 设置状态（true：成功  false：失败）
 */
extern bool SetDayBroadcastContorlEn(uint8_t ContorlEn);

/**
 * @brief 获取开始播报天数
 *
 * @return uint8_t - 播报天数
 */
extern uint8_t GetBroadcastRemainingDays(void);

/**
 * @brief 设置开始播报天数
 *
 * @param Days  - 播报天数
 * @return bool     - 设置状态（true：成功  false：失败）
 */
extern bool SetBroadcastRemainingDays(uint8_t Days);

/**
 * @brief 获取免打扰起始时间 - 时
 *
 * @return uint8_t - 免打扰起始时间 - 时
 */
extern uint8_t GetNoDisturbingStartHour(void);

/**
 * @brief 设置免打扰起始时间 - 时
 *
 * @param StartHour - 免打扰起始时间 - 时
 * @return bool     - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingStartHour(uint8_t StartHour);

/**
 * @brief 获取免打扰起始时间 - 分
 *
 * @return uint8_t - 免打扰起始时间 - 分
 */
extern uint8_t GetNoDisturbingStartMinute(void);

/**
 * @brief 设备免打扰起始时间 - 分
 *
 * @param StartMinute - 免打扰起始时间 - 分
 * @return bool       - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingStartMinute(uint8_t StartMinute);

/**
 * @brief 获取免打扰结束时间 - 时
 *
 * @return uint8_t - 免打扰结束时间 - 时
 */
extern uint8_t GetNoDisturbingEndHour(void);

/**
 * @brief 设置免打扰结束时间 - 时
 *
 * @param EndHour - 免打扰结束时间 - 时
 * @return bool   - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingEndHour(uint8_t EndHour);

/**
 * @brief 获取免打扰结束时间 - 分
 *
 * @return uint8_t - 免打扰结束时间 - 时
 */
extern uint8_t GetNoDisturbingEndMinute(void);

/**
 * @brief 设置免打扰结束时间 - 分
 *
 * @param EndHour - 免打扰结束时间 - 分
 * @return bool   - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingEndMinute(uint8_t EndMinute);

/**
 * @brief 获取电梯机号
 *
 * @return uint8_t 机号
 */
extern uint8_t GetElevatorId(void);

/**
 * @brief 设置电梯机号
 *
 * @param Id 机号
 * @return true
 * @return false
 */
extern bool SetElevatorId(uint8_t Id);

/**
 * @brief 获取电梯起始楼层
 *
 * @return uint8_t
 */
uint8_t GetElevatorStartFloor(void);

/**
 * @brief 设置电梯起始楼层
 *
 * @param ElevatorStartFloor
 * @return true
 * @return false
 */
bool SetElevatorStartFloor(uint8_t ElevatorStartFloor);

/**
 * @brief 获取io板的版本号
 *
 * @param pVersion
 * @return true
 * @return false
 */
extern bool GetIoBoardFirmwareVersionNumber(char *pVersion);

/**
 * @brief 设置io板的版本号
 *
 * @param pVersion
 * @return true
 * @return false
 */
extern bool SetIoBoardFirmwareVersionNumber(char *pVersion);

/**
 * @brief 设置板子固件是否存在的标志位(ota)
 *
 * @param Flag
 * @return true
 * @return false
 */
extern bool SetIoBoardFirmwareExistFlag(uint8_t Flag);

/**
 * @brief  获取板子固件是否存在的标志位(ota)
 *
 * @return uint8_t
 */
extern uint8_t GetIoBoardFirmwareExistFlag(void);

/**
 * @brief 恢复默认用户参数
 *
 */
extern void RestoreDefaultUserParameters(void);

/**
 * @brief 初始化设备参数
 *
 */
extern void InitialisingDeviceParameters(void);

/**
 * @brief 从内存中加载设备参数
 *
 */
extern void LoadDeviceParameterFromMemory(void);

/**
 * @brief 将设备参数写入到内存
 *
 */
extern bool WriteDeviceParametersToMemory(void);

/**
 * @brief 设置目的MAC地址
 *
 * @param pMacAddress
 * @return true
 * @return false
 */
extern bool SetDestinMacAddress(uint8_t *pMacAddress);

/**
 * @brief  清除目的MAC地址
 *
 * @return true
 * @return false
 */
extern bool ClearDestinMacAddress(void);
/**
 * @brief 获取目的MAC地址
 *
 * @param pMacAddress
 * @return true
 * @return false
 */
extern bool GetDestinMacAddress(uint8_t *pMacAddress);

/**
 * @brief 设置公共楼层数据
 * 
 * @param Data 
 * @return true 
 * @return false 
 */
extern bool SetPublicFloorData(uint8_t *Data);

/**
 * @brief 获取公共楼层数据
 * 
 * @param Data 
 * @return true 
 * @return false 
 */
extern bool GetPublicFloorData(uint8_t *Data);

/**
 * @brief Get the Io Board Device Info Table Ptr object
 *
 * @return IoboardDeviceInfo_t*
 */
extern IoboardDeviceInfo_t *GetIoBoardDeviceInfoTablePtr(void);

/**
 * @brief 获取三方识读类型
 * 
 * @return uint8_t ThirdPartyReadType_t
 */
extern uint8_t GetThirdPartyTypeOfReading(void);

/**
 * @brief 设置三方识读类型
 * 
 * @param ThirdPartyTypeOfReading ThirdPartyReadType_t
 * @return true 
 * @return false 
 */
extern bool SetThirdPartyTypeOfReading(uint8_t ThirdPartyTypeOfReading);

/**
 * @brief 获取io板表中，某一个主板序号的固件版本号
 *
 * @param IoboardIndex
 * @param FirmwareVersion
 * @return true
 * @return false
 */
extern bool GetIoBoardFirmwareVersionByTable(uint8_t IoboardAddress, char *FirmwareVersion);

/**
 * @brief 设置io板表中，某一个主板序号的固件版本号
 *
 * @param IoboardAddress
 * @param FirmwareVersion
 * @return true
 * @return false
 */
extern bool SetIoBoardFirmwareVersionByTable(uint8_t IoboardAddress, char *FirmwareVersion);

/**
 * @brief 获取io板表中，所有主板的固件版本号
 *
 * @return IoBoardFirmwareInfo_t*
 */
extern IoBoardFirmwareInfo_t *GetBoardFirmwareInfoPtr(void);

/**
 * @brief 获取电梯扇区密钥
 * 
 * @param pKey 
 * @return true 
 * @return false 
 */
extern bool GetElevatorCardOperationSectorKey(uint8_t *pKey);

/**
 * @brief 设置电梯扇区密钥
 * 
 * @param pKeyIn 
 * @return true 
 * @return false 
 */
extern bool SetElevatorCardOperationSectorKey(const uint8_t *pKeyIn);

/**
 * @brief 获取当前操作的电梯扇区号
 * 
 * @return uint8_t 
 */
extern uint8_t GetElevatorCardOperationSector(void);

/**
 * @brief 设置当前操作的电梯扇区号 
 * 
 * @param SectorNumber 
 * @return true 
 * @return false 
 */
extern bool SetElevatorCardOperationSector(uint8_t SectorNumber);

/**
 * @brief 获取梯控主板数量
 * 
 * @return uint8_t 
 */
extern uint8_t GetEleControlBoardNumber(void);

/**
 * @brief 设置梯控主板数量
 * 
 * @param Number 
 * @return true 
 * @return false 
 */
extern bool SetEleControlBoardNumber(uint8_t Number);

/**
 * @brief 获取梯控开关状态
 * 
 * @return uint8_t 
 */
extern uint8_t GetEleControlSwitch(void);

/**
 * @brief 设置梯控开关状态
 * 
 * @param Switch 
 * @return true 
 * @return false 
 */
extern bool SetEleControlSwitch(uint8_t Switch);

/**
 * @brief 获取火灾报警模式
 * 
 * @return uint8_t 
 */
extern uint8_t GetFireAlarmMode(void);

/**
 * @brief 设置火灾报警模式
 * 
 * @param Mode 
 * @return true 
 * @return false 
 */
extern bool SetFireAlarmMode(uint8_t Mode);

/**
 * @brief 蓝牙主机连接从机信号强度 
 * 
 * @param Rssi (这个值是正数，转成负数用0-Rssi)
 * @return true 
 * @return false 
 */
extern bool SetBleMasterConnectRssi(uint8_t Rssi);

/**
 * @brief 蓝牙主机连接从机信号强度 
 * 
 * @return uint8_t (这个值是正数，转成负数用0-Rssi)
 */
extern uint8_t GetBleMasterConnectRssi(void);


/**
 * @brief 蓝牙主机模式开关
 * 
 * @param Switch 
 * @return true 
 * @return false 
 */
extern bool SetMasterModeSwitch(uint8_t Switch);

/**
 * @brief 蓝牙主机模式开关
 * 
 * @return uint8_t 
 */
extern uint8_t GetMasterModeSwitch(void);

/**
 * @brief Get the Current Update Board Id object
 * 
 * @return uint8_t 
 */
extern uint8_t GetCurrentUpdateBoardId(void);

/**
 * @brief Get the Current Update Board Status object
 * 
 * @return uint8_t 
 */
extern uint8_t GetCurrentUpdateBoardStatus(void);

/**
 * @brief Get the Current Update Board Id object
 * 
 * @return uint8_t 
 */
extern bool SetCurrentUpdateBoardId(uint8_t Id);

/**
 * @brief Get the Current Update Board Status object
 * 
 * @return uint8_t 
 */
extern bool SetCurrentUpdateBoardStatus(uint8_t Status);



#endif
